home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48hor2 / gentab.c < prev    next >
Text File  |  1993-02-18  |  6KB  |  258 lines

  1. /**    Reference table generator, HP48 Utility
  2.     Borland C++ 3.0
  3.     Detlef Mueller, 24.04.1992
  4.     Q&D hack - Usage: GENTAB <[entries file] >[table file]
  5.  
  6.     0.000 24.04.1992 DM    coded
  7.       100 25.08.1992 DM    mofified output to feed it into sasm only
  8. **/
  9.  
  10. #include    <stdio.h>
  11. #include    <stdlib.h>
  12. #include    <stdarg.h>
  13. #include    <string.h>
  14. #include    <ctype.h>
  15.  
  16. #include    <alloc.h>
  17. #include    <errno.h>
  18. #include    <io.h>                /* MesS-DOS */
  19. #include    <fcntl.h>            /* MesS-DOS */
  20.  
  21.  
  22. #define    MAJVER        1
  23. #define    MINVER        0
  24. #define    REVER        0
  25.  
  26. #define    WRKFILE        "________.TMP"
  27. #define    STARTCH        ' '
  28.  
  29.  
  30. typedef enum
  31.     {
  32.         ERROR, WARNING
  33.     }
  34.     ERRTYPE ;
  35.  
  36. typedef    struct
  37.     {
  38.         char name[13] ;
  39.         long addr ;
  40.     }
  41.     ENTRY ;
  42.  
  43.  
  44. static ENTRY
  45.     **table = NULL ;
  46.  
  47. static unsigned int
  48.     entries = 0,
  49.     hash[128 - STARTCH] = { 0 } ;
  50.  
  51.  
  52. void  Error ( ERRTYPE messt, char *msg, ... )
  53. {
  54.     va_list
  55.     argptr ;
  56.     char
  57.     *tstr,
  58.     str[81] ;
  59.  
  60.     va_start( argptr, msg ) ;
  61.     vsprintf( str, msg, argptr ) ;
  62.  
  63.     switch ( messt )
  64.     {
  65.     case ERROR :
  66.         tstr = "\nError: %s " ;
  67.         break ;
  68.  
  69.     case WARNING :
  70.         tstr = "\nWarning: %s " ;
  71.         break ;
  72.  
  73.     default :
  74.         tstr = "Unknown error: %s " ;
  75.     }
  76.  
  77.     fprintf( stderr, tstr, str ) ;
  78.  
  79.     if ( errno != EZERO )
  80.     perror( "" ) ;
  81.     else
  82.     fputc( '\n', stderr ) ;
  83.  
  84.     va_end( argptr ) ;
  85.  
  86.     if ( messt == ERROR )
  87.     exit( -1 ) ;
  88. }
  89.  
  90. static int compare ( const void *s1, const void *s2 )
  91. {
  92.     register char
  93.     *s_1, *s_2 ;
  94.  
  95.     for ( s_1 = (*(ENTRY **)s1)->name, s_2 = (*(ENTRY **)s2)->name ;
  96.       *s_1 || *s_2 ; ++s_1, ++s_2 )
  97.     if ( *s_1 != *s_2 )
  98.         return ( *s_1 - *s_2 ) ;
  99.  
  100.     return ( 0 ) ;
  101. }
  102.  
  103. static void Work ( void )
  104. {
  105.     static char
  106.     image[] = "\\|/-" ;
  107.     static int
  108.     i = 0 ;
  109.  
  110.     fputc( '\b', stderr ) ;
  111.     fputc( image[i = (i + 1) & 3], stderr ) ;
  112. }
  113.  
  114. static void WriteTab ( FILE *fout )
  115. {
  116.     unsigned int
  117.     i, *h ;
  118.     char
  119.     ch = '\0' ;
  120.     ENTRY
  121.     **entry ;
  122.  
  123.     fputs( "\nWriting hash table ...", stderr ) ;
  124.  
  125.     fputs( "\tNIBASC\t`HPHP48-X`\n\tCON(5)\t#02A2C\t\t=DOCSTR\n"
  126.        "\tREL(5)\tTabEnd\n\tNIBASC\t`\\00\\n`\n", fout ) ;
  127.  
  128.     for ( i = 0, h = hash ; i < (sizeof( hash ) / sizeof( *hash )) - 1 ; ++i )
  129.     if ( *h++ )
  130.         fprintf( fout, "\tREL(5)\t_%c_\n", i + STARTCH ) ;
  131.     else
  132.         fprintf( fout, "\tCON(5)\t0\n" ) ;
  133.  
  134.     fprintf( fout, "\tREL(5)\tTabEnd\n" ) ;
  135.  
  136.     fputs( "\nWriting reference table ...  ", stderr ) ;
  137.  
  138.     for ( i = 0, entry = table ; i < entries ; ++i, ++entry )
  139.     {
  140.     if ( *(*entry)->name != ch )
  141.         fprintf( fout, "_%c_\n", ch = *(*entry)->name ) ;
  142.  
  143.     fprintf( fout,"\tCON(6)\t#%lX\n\tNIBASC\t`%s`\n",
  144.          (*entry)->addr | ((long)strlen( (*entry)->name ) << 20),
  145.          (*entry)->name ) ;
  146.  
  147.     free( *entry ) ;
  148.  
  149.     if ( ! (i % 100) )
  150.         Work() ;
  151.     }
  152.  
  153.     free( table ) ;
  154.     fputs( "TabEnd\n", fout ) ;
  155.     fputs( "\b ", stderr ) ;
  156. }
  157.  
  158. static void ReadTab ( FILE *fin )
  159. {
  160.     static char
  161.     line[80], buffer[256] ;
  162.     char
  163.     *pl, *pa ;
  164.     unsigned int
  165.     i ;
  166.     long
  167.     addr ;
  168.     ENTRY
  169.     entry, **tab ;
  170.     FILE
  171.     *ftmp ;
  172.  
  173.     if ( ! (ftmp = fopen( WRKFILE, "wb" )) )
  174.     Error( ERROR, "Can't create <%s>", WRKFILE ) ;
  175.  
  176.     fprintf( stderr, "\nReading and converting input ...  " ) ;
  177.  
  178.     while ( fgets( line, 80, fin ) )
  179.     if ( strlen( line ) && *line != '\n' )
  180.     {
  181.         pl = strcpy( buffer, line ) ;
  182.  
  183.         if (    ! (pl = strtok( *pl == '=' ? pl + 1 : pl, "\n\r\t " ))
  184.          || strlen( pl ) > 12
  185.          || *pl == '*'
  186.          || *pl == '~'
  187.          || ! strtok( NULL, "\n\r\t " )
  188.          || ! (pa = strtok( NULL, "\n\r\t " ))
  189.          || ! (i = sscanf( *pa == '#' ? pa + 1 : pa, "%lX", &addr ))
  190.          || i == EOF
  191.          || (addr & 0xFFF00000L) )
  192.         continue ;
  193.  
  194.         hash[*pl - STARTCH] = 1 ;
  195.         strcpy( entry.name, pl ) ;
  196.         entry.addr = addr ;
  197.  
  198.         if ( ! fwrite( &entry, sizeof( ENTRY ), 1, ftmp ) )
  199.         Error( ERROR, "Write error on <%s>", WRKFILE ) ;
  200.  
  201.         if ( ! (++entries % 100) )
  202.         Work() ;
  203.     }
  204.  
  205.     fclose( ftmp ) ;
  206.  
  207.     if ( ! entries )
  208.     Error( ERROR, "Sorry, no entries found" ) ;
  209.  
  210.     fputs( "\b ", stderr ) ;
  211.     fprintf( stderr, "\nFound %u symbols\nGenerating table ...  ", entries ) ;
  212.  
  213.     if ( ! (ftmp = fopen( WRKFILE, "rb" )) )
  214.     Error( ERROR, "Can't reopen <%s>", WRKFILE ) ;
  215.  
  216.     if ( ! (table = (ENTRY **)malloc( entries * sizeof( ENTRY *) )) )
  217.     Error( ERROR, "Can't alloc room for %u entries", entries ) ;
  218.  
  219.     for ( i = 0, tab = table ; i < entries ; ++i, ++tab )
  220.     {
  221.     if ( ! (*tab = (ENTRY *)malloc( sizeof( ENTRY ) )) )
  222.         Error( ERROR, "Can't alloc %d bytes room for %uth entry",
  223.            sizeof( ENTRY ), i ) ;
  224.  
  225.     if ( ! fread( *tab, sizeof( ENTRY ), 1, ftmp ) )
  226.         Error( ERROR, "Can't read %uth entry from <%s>", i, WRKFILE ) ;
  227.  
  228.     if ( ! (i % 100) )
  229.         Work() ;
  230.     }
  231.  
  232.     fputs( "\b ", stderr ) ;
  233.  
  234.     fclose( ftmp ) ;
  235.     unlink( WRKFILE ) ;
  236. }
  237.  
  238. void  main ( int argc, char *argv[] )
  239. {
  240.     fprintf( stderr,
  241.          "\n%s, Version %d.%d.%d, %s  %s  BC %X.%X, (c) 1992 DM.\n",
  242.          argv[0], MAJVER, MINVER, REVER, __DATE__, __TIME__,
  243.          __TURBOC__ >> 8, __TURBOC__ & 0x00FF ) ;    /* MesS-DOS */
  244.  
  245.     setmode( fileno( stdout ), O_BINARY ) ;        /* MesS-DOS */
  246.     setmode( fileno( stdin ), O_BINARY ) ;        /* MesS-DOS */
  247.  
  248.     ReadTab( stdin ) ;
  249.     fprintf( stderr, "\nSorting (by name)..." ) ;
  250.     qsort( table, entries, sizeof( ENTRY * ), compare ) ;
  251.     WriteTab( stdout ) ;
  252.  
  253.     fprintf( stderr,
  254.          "\nExecute\n\tSASM -E -N -H -o tab tab.a\nto create a binary table\n" ) ;
  255.  
  256.     exit( 0 ) ;
  257. }
  258.